package lanQiaoBei.搜索与图论.最短路.spfa;
import java.io.*;
import java.math.*;
import java.util.*;
/*spfa判负环
题目描述
给定一个n个点m条边的有向图，图中可能存在重边和自环， 边权可能为负数。

请你判断图中是否存在负权回路。

输入格式
第一行包含整数n和m。

接下来m行每行包含三个整数x，y，z，表示点x和点y之间存在一条有向边，边长为z。

输出格式
如果图中存在负权回路，则输出“Yes”，否则输出“No”。

数据范围
1≤n≤2000,
1≤m≤10000,
图中涉及边长绝对值均不超过10000。

样例
输入样例：
3 3
1 2 -1
2 3 4
3 1 -4
输出样例：
Yes
* */
public class P2 {
    static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    final static int N=2010,M=5*N;
    static int h[]=new int[N],e[]=new int[M],ne[]=new int[M],w[]=new int[N],dist[]=new int[N],idx,n,m,cnt[]=new int[N];
    static boolean inq[]=new boolean[N];
    static void add(int a,int b,int c){
           e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
    }
    static void scan()throws Exception{
           String[]ss=br.readLine().split(" ");
           n=Integer.parseInt(ss[0]);m=Integer.parseInt(ss[1]);
           Arrays.fill(h,-1);
           while(m-->0){
                ss=br.readLine().split(" ");
                add(Integer.parseInt(ss[0]),Integer.parseInt(ss[1]),Integer.parseInt(ss[2]));
           }
    }
    static boolean spfa(){
           Arrays.fill(dist,0x3f3f3f3f);
           dist[1]=0;
           LinkedList<Integer>q=new LinkedList();
           for(int i=1;i<=n;i++){
               q.offer(i);
               inq[i]=true;
           }
           while(q.size()>0){
               int t=q.poll();
               inq[t]=false;
               for(int i=h[t];i!=-1;i=ne[i]){
                   int j=e[i];
                   if(dist[t]+w[i]<dist[j]){
                       dist[j]=dist[t]+w[i];
                       cnt[j]=cnt[t]+1;
                       if(cnt[j]>=n)return true;
                       if(!inq[j]){
                           q.offer(j);
                           inq[j]=true;
                       }
                   }
               }
           }
           return false;
    }
    public static void main(String[]args)throws Exception{
           scan();
           if(spfa()){
               System.out.print("yes");
           }else System.out.print("false");
    }
}
